package com.sgcc.pda.hzaidl.impl;


import com.sgcc.pda.hw.IProtocol645Manager;
import com.sgcc.pda.hw.ReturnResult;

import org.json.JSONException;
import org.json.JSONObject;

/**
 * @创建者：suven on 2019/12/17 13:41
 * @描述：
 * @版本：1.0
 * @修改人：
 * @修改时间：
 * @修改说明：
 * @修改版本：
 */
public class Protocol645Manager extends IProtocol645Manager.Stub {
    private static Protocol645Manager mInstance;

    /**
     * 单例
     *
     * @return
     */
    public static synchronized Protocol645Manager getInstance() {
        if (mInstance == null) {
            mInstance = new Protocol645Manager();
        }
        return mInstance;
    }

    /**
     * 向电表发起红外认证请求
     *
     * @param meterAddress 表通讯地址
     * @param random1      安全单元返回的随机数1
     * @param operator     操作员编号
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0:meterNo      返回-表号
     * 1:esamNo       返回-ESAM模块编号
     * 2:enRandom1    返回-经过ESAM模块加密的随机数1密文
     * 3:random2      返回-随机数2
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult infraIdentityReq(String meterAddress, String random1, String operator) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("random1", random1);
            jb.put("operator", operator);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_infraIdentityReq", jb.toString());

    }

    /**
     * 电表执行红外认证
     *
     * @param meterAddress 表通讯地址
     * @param enRandom2    经安全单元加密的随机数2密文
     * @param operator     操作员编号
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas(code==0): size==0
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult infraIdentity(String meterAddress, String enRandom2, String operator) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("enRandom2", enRandom2);
            jb.put("operator", operator);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_infraIdentity", jb.toString());

    }

    /**
     * 电表执行远程身份认证
     *
     * @param meterAddress 表通讯地址
     * @param cipher       安全单元返回的密文
     * @param random1      安全单元返回的随机数1
     * @param meterNo      电表表号
     * @param operator     操作员编号
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0:random2      返回-随机数2
     * 1:esamNo       返回-ESAM模块编号
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult identityAuthentication(String meterAddress, String cipher, String random1, String meterNo,
                                               String operator, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("cipher", cipher);
            jb.put("random1", random1);
            jb.put("meterNo", meterNo);
            jb.put("operator", operator);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_identityAuthentication", jb.toString());

    }

    /**
     * 向电表写入第一类数据
     *
     * @param meterAddress 电表通讯地址
     * @param dataSign     数据标识
     * @param password     密码
     * @param operator     操作员编号
     * @param data         待写入数据
     * @param mac          安全单元计算的MAC
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult writeClass1Data(String meterAddress, String dataSign, String password, String operator,
                                        String data, String mac, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("dataSign", dataSign);
            jb.put("password", password);
            jb.put("operator", operator);
            jb.put("data", data);
            jb.put("mac", mac);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_writeClass1Data", jb.toString());

    }

    /**
     * 向电表写入第二类数据
     *
     * @param meterAddress 电表通讯地址
     * @param dataSign     数据标识
     * @param password     密码
     * @param operator     操作员编号
     * @param data         待写入数据
     * @param mac          安全单元计算的MAC
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult writeClass2Data(String meterAddress, String dataSign, String password, String operator,
                                        String data, String mac, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("dataSign", dataSign);
            jb.put("password", password);
            jb.put("operator", operator);
            jb.put("data", data);
            jb.put("mac", mac);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_writeClass2Data", jb.toString());

    }

    /**
     * 向电表写入第三类数据
     *
     * @param meterAddress 电表通讯地址
     * @param dataSign     数据标识
     * @param password     密码
     * @param operator     操作员编号
     * @param data         待写入数据
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult writeClass3Data(String meterAddress, String dataSign, String password, String operator,
                                        String data, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("dataSign", dataSign);
            jb.put("password", password);
            jb.put("operator", operator);
            jb.put("data", data);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_writeClass3Data", jb.toString());

    }

    /**
     * 广播校时
     * 时间格式为ssMMhhddmmyy
     *
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult broadcastTiming(int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_broadcastTiming", jb.toString());

    }

    /**
     * 设置电表时间
     *
     * @param meterAddress 电表通讯地址
     * @param time         设置的时间字符串ssMMhhwwddmmyy（秒分时周日月年）
     * @param password     密码
     * @param operator     操作员编号
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult Timing(String meterAddress, String keyLevel, String time, String password, String operator, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("keyLevel", keyLevel);
            jb.put("time", time);
            jb.put("password", password);
            jb.put("operator", operator);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_Timing", jb.toString());

    }

    /**
     * 设置客户编号
     *
     * @param meterAddress 电表通讯地址
     * @param consNo       客户编号
     * @param password     密码
     * @param operator     操作员编号
     * @param mac          安全单元计算MAC
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult writeConsNo(String meterAddress, String consNo, String password, String operator,
                                    String mac, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("consNo", consNo);
            jb.put("password", password);
            jb.put("operator", operator);
            jb.put("mac", mac);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_writeConsNo", jb.toString());

    }

    /**
     * 获取表地址
     *
     * @param cover 表地址掩码
     * @param mode  通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0：meterAddress 返回-表地址
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult getMeterAddress(String cover, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("cover", cover);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_getMeterAddress", jb.toString());

    }

    /**
     * 获取表号
     *
     * @param meterAddress 电表通讯地址
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0：meterNo      返回-电表表号
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult getMeterNo(String meterAddress, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_getMeterNo", jb.toString());

    }

    /**
     * 获取户号
     *
     * @param meterAddress 电表通讯地址
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0：consNo       返回-户号
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult getConsNo(String meterAddress, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_getConsNo", jb.toString());

    }

    /**
     * 读取电表档案信息
     *
     * @param meterAddress 电表通讯地址
     * @param dataSign     数据标识
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0: archives      返回-档案信息
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult Connect(String meterAddress, String dataSign, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("dataSign", dataSign);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_Connect", jb.toString());

    }

    /**
     * 获取电表时间
     *
     * @param meterAddress 电表通讯地址
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0：time         返回-电表时间，格式为：yyyymmddhhMMss
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult getMeterTime(String meterAddress, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_getMeterTime", jb.toString());

    }

    /**
     * 读取电表时段数
     *
     * @param meterAddress 通信地址
     * @param datasign     数据标识
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0：amount    返回 - 电表时段数
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult readMeterPriodAmount(String meterAddress, String datasign, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
            jb.put("datasign", datasign);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_readMeterPriodAmount", jb.toString());

    }

    /**
     * 获取电表当前电能数据
     *
     * @param meterAddress 电表通讯地址
     * @param dataSign     要读取的数据标识
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:  返回-电能数据
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult getPowerData(String meterAddress, String dataSign, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
            jb.put("dataSign", dataSign);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_getPowerData", jb.toString());

    }

    /**
     * 获取所有正向有功电能
     *
     * @param meterAddress 电表通讯地址
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:  返回-正向有功电能列表
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult getAllPaPower(String meterAddress, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_getAllPaPower", jb.toString());

    }

    /**
     * 获取所有反向有功电能
     *
     * @param meterAddress 电表通讯地址
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:  返回-反向有功电能列表
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult getAllNaPower(String meterAddress, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_getAllNaPower", jb.toString());

    }

    /**
     * 获取所有正向无功（组合无功1）电能
     *
     * @param meterAddress 电表通讯地址
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:  返回-正向无功（组合无功1）电能列表
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult getAllPrPower(String meterAddress, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_getAllPrPower", jb.toString());

    }

    /**
     * 获取所有反向无功（组合无功2）电能
     *
     * @param meterAddress 电表通讯地址
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:  返回-返回-反向无功（组合无功2）电能列表
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult getAllNrPower(String meterAddress, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_getAllNrPower", jb.toString());

    }

    /**
     * 获取最大需量及发生时间
     *
     * @param meterAddress 电表通讯地址
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0:data         返回-最大需量 格式为XX.XXXX
     * 1:time         返回-最大需量发生时间 格式为yyyymmddhhMM
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult getMaxDemandAndTime(String meterAddress, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_getMaxDemandAndTime", jb.toString());

    }

    /**
     * 获取日冻结时间点
     *
     * @param meterAddress 电表通讯地址
     * @param mode         通讯方式：0 红外  1 串口(485线)
     *                     :List<String> datas（code==0）:
     *                     0:time         返回-日冻结时间点 格式hhMM
     *                     :List<String> datas(code==其他): size==0
     */
    public ReturnResult getFreezenDayTime(String meterAddress, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_getFreezenDayTime", jb.toString());

    }

    /**
     * 获取上N次冻结日期
     *
     * @param meterAddress 电表通讯地址
     * @param dayIndex     冻结数据索引
     * @param mode         通讯方式：0 红外  1 串口(485线)
     *                     :List<String> datas（code==0）:
     *                     0:date         返回-冻结日期 格式：yyyymmddhhMM
     *                     :List<String> datas(code==其他): size==0
     */
    public ReturnResult getFreezeDate(String meterAddress, String dayIndex, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("dayIndex", dayIndex);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_getFreezeDate", jb.toString());

    }

    /**
     * 读取电表冻结数据信息
     *
     * @param meterAddress 电表表地址
     * @param dayIndex     日期索引（第几次冻结）
     * @param dataSignBase 要读取的冻结数据数据标识
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:  返回-冻结数据信息
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult getFreezePowerData(String meterAddress, String dayIndex, int dataSignBase, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("dayIndex", dayIndex);
            jb.put("dataSignBase", dataSignBase);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_getFreezePowerData", jb.toString());

    }

    /**
     * 读取日冻结正向有功电能
     *
     * @param meterAddress 电表通讯地址
     * @param dayIndex     冻结数据索引
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:  返回-日冻结正向有功电能列表
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult getFreezeDayPaPower(String meterAddress, String dayIndex, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("dayIndex", dayIndex);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_getFreezeDayPaPower", jb.toString());

    }

    /**
     * 读取日冻结反向有功电能
     *
     * @param meterAddress 电表通讯地址
     * @param dayIndex     冻结数据索引
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:  返回-日冻结反向有功电能列表
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult getFreezeDayNaPower(String meterAddress, String dayIndex, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("dayIndex", dayIndex);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_getFreezeDayNaPower", jb.toString());

    }

    /**
     * 读取日冻结正向无功(组合无功1)电能
     *
     * @param meterAddress 电表通讯地址
     * @param dayIndex     冻结数据索引
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:  返回-日冻结正向无功(组合无功1)电能
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult getFreezeDayPrPower(String meterAddress, String dayIndex, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("dayIndex", dayIndex);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_getFreezeDayPrPower", jb.toString());

    }

    /**
     * 读取日冻结反向无功(组合无功2)电能
     *
     * @param meterAddress 电表通讯地址
     * @param dayIndex     冻结数据索引
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:  返回-日冻结反向无功(组合无功2)电能
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult getFreezeDayNrPower(String meterAddress, String dayIndex, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("dayIndex", dayIndex);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_getFreezeDayNrPower", jb.toString());

    }

    /**
     * 更新密钥
     *
     * @param meterAddress 电表通讯地址
     * @param datasign     密钥类型
     * @param msg
     * @param cipher
     * @param operator     操作员编号
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult keyUpdate(String meterAddress, String datasign, String msg, String cipher, String operator, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("datasign", datasign);
            jb.put("msg", msg);
            jb.put("cipher", cipher);
            jb.put("operator", operator);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_keyUpdate", jb.toString());

    }

    /**
     * 更新密钥
     *
     * @param meterAddress 电表通讯地址
     * @param datasign     密钥类型
     * @param msg
     * @param cipher
     * @param operator     操作员编号
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult keyUpdate2(String meterAddress, String datasign, String msg, String cipher,
                                   String operator, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("datasign", datasign);
            jb.put("msg", msg);
            jb.put("cipher", cipher);
            jb.put("operator", operator);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_keyUpdate2", jb.toString());

    }

    /**
     * 更新密钥
     *
     * @param meterAddress 电表通讯地址
     * @param datasign     密钥类型
     * @param msg
     * @param cipher
     * @param operator     操作员编号
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult keyUpdate13(String meterAddress, String datasign, String operator, String cipher, String msg
            , int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("datasign", datasign);
            jb.put("msg", msg);
            jb.put("cipher", cipher);
            jb.put("operator", operator);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_keyUpdate13", jb.toString());

    }

    /**
     * 远程充值并开户
     *
     * @param meterAddress 电表通讯地址
     * @param money        充值金额,以元为单位
     * @param time         充值次数
     * @param mac1         安全单元计算的金额与次数MAC
     * @param consNo       客户编号
     * @param mac2         安全单元计算客户编号MAC
     * @param operator     操作员编号
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult recharge(String meterAddress, String money, String time, String mac1, String consNo,
                                 String mac2, String operator, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("money", money);
            jb.put("time", time);
            jb.put("mac1", mac1);
            jb.put("consNo", consNo);
            jb.put("mac2", mac2);
            jb.put("operator", operator);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_recharge", jb.toString());

    }

    /**
     * 事件清零
     *
     * @param meterAddress 电表通讯地址
     * @param dataSign     数据标识
     * @param keyLevel     密级
     * @param password     密码
     * @param operator     操作员编号
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult eventClear(String meterAddress, String dataSign, String keyLevel, String password, String operator, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("dataSign", dataSign);
            jb.put("keyLevel", keyLevel);
            jb.put("password", password);
            jb.put("operator", operator);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_eventClear", jb.toString());

    }

    /**
     * 电表清零
     *
     * @param meterAddress 电表通讯地址
     * @param keyLevel     密级
     * @param password     密码
     * @param operator     操作员编号
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult meterClear(String meterAddress, String keyLevel, String password, String operator, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("keyLevel", keyLevel);
            jb.put("password", password);
            jb.put("operator", operator);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_meterClear", jb.toString());

    }

    /**
     * 设置电表当前通讯速率为其它标准速率
     *
     * @param meterAddress 电表通讯地址
     * @param baud         波特率字符串
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult setTbtl(String meterAddress, String baud, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("baud", baud);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_setTbtl", jb.toString());

    }

    /**
     * 写电表通讯地址
     *
     * @param meterAddress    电表通讯地址
     * @param newMeterAddress 电表新通讯地址
     * @param mode            通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult writeMeterAddress(String meterAddress, String newMeterAddress, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("newMeterAddress", newMeterAddress);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_writeMeterAddress", jb.toString());

    }

    /**
     * 获取费率信息
     *
     * @param meterAddress 电表通讯地址
     * @param dataSign     读取费率数据标识
     * @param index        费率序号
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0：rate         返回-费率信息
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult readRate(String meterAddress, String dataSign, String index, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("dataSign", dataSign);
            jb.put("index", index);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_readRate", jb.toString());

    }

    /**
     * 读取电表第一套费率(当前套)
     *
     * @param meterAddress 电表通讯地址
     * @param rateIndex    费率序号
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0：rate         返回-电表第一套费率(当前套)
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult readRate1(String meterAddress, String rateIndex, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("rateIndex", rateIndex);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_readRate1", jb.toString());

    }

    /**
     * 读取电表第二套费率(备用套)
     *
     * @param meterAddress 电表通讯地址
     * @param rateIndex    费率序号
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0：rate         返回-电表第二套费率(备用套)
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult readRate2(String meterAddress, String rateIndex, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("rateIndex", rateIndex);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_readRate2", jb.toString());

    }

    /**
     * 读取电表余额
     *
     * @param meterAddress 电表通讯地址
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0：amount       返回-电表余额
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult readResidualAmount(String meterAddress, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_readResidualAmount", jb.toString());

    }

    /**
     * 读取电表充值信息
     *
     * @param meterAddress 电表通讯地址
     * @param operator     操作员号
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0：surplusAmount       返回-充值金额
     * 1：rechargeTimes       返回-充值时间
     * 2：customCode          返回-充值号
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult readRechargeInfo(String meterAddress, String operator, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("operator", operator);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_readRechargeInfo", jb.toString());

    }

    /**
     * 读取电表透支金额
     *
     * @param meterAddress 电表通讯地址
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0：amount       返回-电表透支金额
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult readOverdrawAmount(String meterAddress, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_readOverdrawAmount", jb.toString());

    }

    /**
     * 执行电表控制功能
     *
     * @param meterAddress 电表通讯地址
     * @param operator     操作员
     * @param cipherText   电表控制数据
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult powerOperate(String meterAddress, String operator, String cipherText, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("cipherText", cipherText);
            jb.put("operator", operator);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_powerOperate", jb.toString());

    }

    /**
     * 根据数据标识读取电表数据（非97表）
     *
     * @param meterAddress 电表通讯地址
     * @param dataSign     数据标识
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0：retData      返回-读取到的返回值
     * :List<String> datas(code==其他): size==0
     * @paramisMeter97 是否为97电能表
     */
    public ReturnResult commonReadIsNot97(String meterAddress, String dataSign, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("dataSign", dataSign);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_commonReadIsNot97", jb.toString());

    }

    /**
     * 根据数据标识读取电表数据
     *
     * @param meterAddress 电表通讯地址
     * @param dataSign     数据标识
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0：retData      返回-读取到的返回值
     * :List<String> datas(code==其他): size==0
     * @paramisMeter97 是否为97电能表
     */
    public ReturnResult commonRead(String meterAddress, String dataSign, boolean isMeter97, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("dataSign", dataSign);
            jb.put("isMeter97", isMeter97);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_commonRead", jb.toString());

    }

    public ReturnResult getMeterSqSdInfo(String meterAddress, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_getMeterSqSdInfo", jb.toString());

    }

    /**
     * 读取电表运行费率
     *
     * @param meterAddress 电表通讯地址
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:
     * 0：amount       返回-电表运行费率
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult getMeterFlInfo(String meterAddress, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_getMeterFlInfo", jb.toString());

    }

    /**
     * 设置通信超时时间，如何串口已经打开，则改变为关闭状态，需要重新打开后生效
     *
     * @param sendTimeOut    发送超时时间 毫秒
     * @param receiveTimeOut 接收超时时间 毫秒
     */
    public void setInfraTimeOut(int sendTimeOut, int receiveTimeOut) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("sendTimeOut", sendTimeOut);
            jb.put("receiveTimeOut", receiveTimeOut);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        HardWareUtil.requestHardwareData("meter645_setInfraTimeOut", jb.toString());

    }


    /**
     * 根据数据标识写电表数据
     *
     * @param meterAddress 电表通讯地址
     * @param dataSign     数据标识
     * @param mode         通讯方式：0 红外  1 串口(485线)
     */
    public ReturnResult commonWrite(String meterAddress, String dataSign, String keyLevel,
                                    String password, String operator, String data, String mac, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("dataSign", dataSign);
            jb.put("keyLevel", keyLevel);
            jb.put("password", password);
            jb.put("operator", operator);
            jb.put("data", data);
            jb.put("mac", mac);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_commonWrite", jb.toString());

    }

    /**
     * 执行电表控制功能
     *
     * @param meterAddress 电表通讯地址
     * @param operator     操作员
     * @param cipherText   电表控制数据
     * @param keyLevel     密级
     * @param password     二级密码
     * @param mode         通讯方式：0 红外  1 串口(485线)
     */
    public ReturnResult commonOperate(String meterAddress, String keyLevel, String operator, String password, String cipherText, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("keyLevel", keyLevel);
            jb.put("password", password);
            jb.put("operator", operator);
            jb.put("cipherText", cipherText);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_commonOperate", jb.toString());

    }

    /**
     * 执行97电表控制功能
     *
     * @param meterAddress 电表通讯地址
     * @param cipherText   电表控制数据
     * @param password     二级密码
     * @param mode         通讯方式：0 红外  1 串口(485线)
     */
    public ReturnResult powerOperate97(String meterAddress, String password, String cipherText, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("password", password);
            jb.put("cipherText", cipherText);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_powerOperate97", jb.toString());

    }

    /**
     * 读取负荷类数据
     *
     * @param meterAddress 电表通讯地址
     * @param dataSign     数据标识
     * @param dataNum      负荷记录块数
     * @param dateTime     时间
     */
    public ReturnResult readLoadData(String meterAddress, String dataSign, String dataNum, String dateTime, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("dataSign", dataSign);
            jb.put("dataNum", dataNum);
            jb.put("dateTime", dateTime);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_readLoadData", jb.toString());

    }

    /**
     * 远程开户或充值
     *
     * @param meterAddress 电表通讯地址
     * @param type         业务类型：0 开户  1 充值
     * @param money        充值金额,以元为单位
     * @param time         充值次数
     * @param mac1         安全单元计算的金额与次数MAC
     * @param consNo       客户编号
     * @param mac2         安全单元计算客户编号MAC
     * @param operator     操作员编号
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult openAccountOrRecharge(String meterAddress, String type, String money, String time, String mac1, String consNo,
                                              String mac2, String operator, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("type", type);
            jb.put("money", money);
            jb.put("time", time);
            jb.put("mac1", mac1);
            jb.put("consNo", consNo);
            jb.put("mac2", mac2);
            jb.put("operator", operator);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_openAccountOrRecharge", jb.toString());

    }

    /**
     * 读取安全认证数据项的值
     *
     * @param meterAddress 电表通讯地址
     * @param operator     操作员编号
     * @param mode         通讯方式：0 红外  1 串口(485线)
     * @return ReturnResult  :int code  0 成功  其他失败
     * :List<String> datas（code==0）:   size==0
     * :List<String> datas(code==其他): size==0
     */
    public ReturnResult readSafeData(String meterAddress, String itemCode, String operator, int mode) {
        JSONObject jb = new JSONObject();
        try {
            jb.put("meterAddress", meterAddress);
            jb.put("itemCode", itemCode);
            jb.put("operator", operator);
            jb.put("mode", mode);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return HardWareUtil.requestHardwareData("meter645_readSafeData", jb.toString());

    }

}
